<?php
//класс для рисования капчи
class captchaClass
{
    protected $font;
    protected $random_string;
    protected $width;
    protected $height;
    protected $fontWidth;
    protected $fontHeight;
    
    public function __construct($rnd_string)
    {
        if( $rnd_string == "" )
            $rnd_string = "1234";
        $this->random_string = $rnd_string;   //запомнили строку
        $this->font = imageloadfont('anonymous.gdf');  //загрузили шрифт
        
        if (!$this->font) //шрифт такой не найден
            $this->random_string = "FONT NOT FOUND";
        //считаем размеры
        $this->fontWidth = imagefontwidth($this->font);
        $this->fontHeight = imagefontheight($this->font);
        $this->width  = strlen($this->random_string) * $this->fontWidth;
        $this->height = $this->fontHeight;    
    }
    
    public function getImage()
    {//рисуем картинку
        $img = ImageCreate ($this->width, $this->height) 
            or die ("Cannot Initialize new GD image stream");
        $z = 0;

        while( $z < 140 )
        {
            $col1 = imagecolorallocate($img, 
                mt_rand(100, 255), mt_rand(100, 255), mt_rand(100, 255));
            imagefilledellipse($img, mt_rand(0, $this->width), 
                mt_rand(0, $this->height), 
                mt_rand(0, 50), mt_rand(0, 50), $col1);
            $z++;
        }
        //пишем строку разноцветными буквами
        $z = 0;
        while( $z < 6 )
        {
            $col1 = imagecolorallocate($img, 
                mt_rand(0, 100), mt_rand(0, 100), mt_rand(0, 100));
            $ch = substr($this->random_string, $z, 1); //берем одну букву
            imagestring($img, $this->font, $z*$this->fontWidth + 2, 0, $ch, $col1);
            $z++;
        }

        //уродуем картинку
        $img2 = ImageCreate($this->width, $this->height) 
            or die ("Cannot Initialize new GD image stream");
        $x=1;
        $i=0;
        //делаем волны
        while( $x < $this->width )
        {
            $xx = mt_rand(1,2);
            $yy = mt_rand(5,7);
            $i=$i+($xx/10);        // шаг для Sina
            $y = ceil(sin($i)*$yy);// смещение по Y
            imagecopy ($img2, $img, $x, $y, $x, 0, 1, $this->height); // копирование куска в новую картинку
            $x++;
        }
        //уничтожаем ненужную картинку
        imagedestroy($img);   
        //возвращаем готовую картинку
        return $img2;
    }
}